﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RAE.Persistencia;
using System.Drawing;
using RAE.Logica.Controladores;

namespace RAE.Logica.Info
{
    public class Ajedrecista : IComparable<Ajedrecista>
    {
        #region Atributos
        public int    id          { get; set; }

        public String nombre      { get; set; }
        public String apellidos   { get; set; }
        public String cedula      { get; set; }
        public int    puntaje_elo { get; set; }

        public List<Historia> historial { get; set; }

        public Categoria    categoria { get; set; }
        public List<Titulo> titulos   { get; set; }
        public String stringTitulos { get; set; }

        public DateTime fechaRegistro   { get; set; }
        public DateTime? fechaNacimiento { get; set; }
        public DateTime? fechaDeceso     { get; set; }

        public Pais nacionalidad { get; set; }
        public bool esResidente { get; set; }
        
        public String tel_residencia { get; set; }
        public String tel_celular    { get; set; }
        public String email          { get; set; }
        public String comentario     { get; set; }

        public Estadistica estadisticas { get; set; }

        public byte[] fotografia { get; set; }
        #endregion
        
        #region Constructores
        
        public Ajedrecista()
        {
            stringTitulos = "";
            titulos = new List<Titulo>();
            estadisticas = new Estadistica();
        }
        #endregion
        
        #region Metodos publicos

        public bool enCategoria(Categoria c)
        {
            return (this.puntaje_elo >= c.puntaje_elo_min);
        }

        public void gettitulos()
        {
            this.titulos = Cargador.obtenerTitulosPorAjedrecista(this) ?? new List<Titulo>();
            agruparTitulos();
        }

        public void getHistorialElo()
        {
            if (historial == null)
            {
                historial = new List<Historia>();
                foreach (Periodo periodo in Aplicacion.periodos)
                {
                    historial.Add(new Historia(periodo));
                }
                Cargador.obtenerHistorialElo(this);
            }
        }
        public void actualizarElo(int elo)
        {
            this.puntaje_elo = elo;
            Cargador.actualizarElo(this);
        }
        public void actualizarHistorial(Periodo periodo)
        {
            historial.Add(new Historia(this.puntaje_elo, periodo));
            Cargador.actualizarHistorial(this);
        }


        #endregion

        private void agruparTitulos()
        {
            foreach (Titulo t in this.titulos)
                this.stringTitulos += t.codigo + " ";

            this.stringTitulos.TrimEnd();
        }

        public override string ToString()
        {
            return this.apellidos + ", " + this.nombre;
        }

        int IComparable<Ajedrecista>.CompareTo(Ajedrecista other)
        {
            int porElo = other.puntaje_elo.CompareTo(this.puntaje_elo);

            if (porElo == 0)
                return this.ToString().CompareTo(other.ToString());
            else
                return porElo;
        }
    }
}
